public class ListNode {
       int val;
       ListNode next;
       ListNode() {}
       ListNode(int val) { this.val = val; }
       ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

class Solution {
    /**
     * 给定一个已排序的链表的头 head,删除所有重复的元素，使每个元素只出现一次,返回已排序的链表
     * @param head 已排序链表的头节点
     * @return 返回去重链表后的头节点
     */
    public ListNode deleteDuplicates(ListNode head) {
        //若链表为空,则无需去除重复元素
        if (head == null) return head;
        //创建虚拟头节点
        ListNode dummyNode = new ListNode(-1);
        //新链表第一个节点必为旧链表的头节点
        dummyNode.next = head;
        //cur标记当前节点
        ListNode cur = head.next;
        //遍历链表
        while(cur != null) {
            //若当前节点与新链表最后一个节点 val值不等,则尾插加入新链表
            if (cur.val != head.val) {
                head.next = cur;
                head = cur;
                cur = cur.next;
            } else {
                //若当前节点与新链表最后一个节点 val值相等,则往后移动 cur
                cur = cur.next;
            }
        }
        //将新链表的 next域置为 null
        head.next = null;
        //返回新链表的头节点
        return dummyNode.next;
    }
}